LOADING...

loading

数组快速创建与排序稳定性探究

数组快速创建问题

我们有时候需要快速创建一个数组,比如一个1-30的下拉列表,该怎么写呢?

如果我们直接在初始化的时候赋值 ,代码会显得冗余不堪。

而如果用 for 循环一个个push,也觉得不够简洁。

data(){
    return {
        arr : [1, 2, 3, ......, 29, 30],
        arr2 : []
    }
}
 
created(){
    for(let i = 1; i <= 30; i++){
        this.arr2.push(i);
    }
}

ES6里面为此类情况提供了Array.from 函数,它能将伪数组变成数组(length属性需存在)。以下是相关代码示例:

<div v-for="item in arr3" :key="item">{{ item }}</div>
 
data(){
    return {
        arr : Array.from('12345'), // ["1", "2", "3", "4", "5"]
 
        arr2 : Array.from({ 0 : 'a', 1 : 'b', length : 2 }),  // ["a", "b"]
 
        arr3 : Array.from({ length: 30 }, (item, index) => index + 1),  // [1, 2, 3, ......, 29, 30]
 
        arr4 : Array.from({ length: 4 }, () => ({}))  // [{}, {}, {}, {}]
    }
}

与此同时,v-for 可以接收整数,不一定要是变量。在这种情况下,它会把模板重复对应次数。目前来看这种方式是最快捷的。

<Select v-model="value">
    <Option v-for="n in 30" :value="n" :key="n">
        {{ n }}
    </Option>
</Select>
// 1,2,3......30

排序稳定性问题

常见的排序算法之中,插入排序、合并排序、冒泡排序等都是稳定的,堆排序、快速排序等是不稳定的。

不稳定排序的主要缺点是,多重排序时可能会产生问题。

假设有一个姓和名的列表,要求按照“姓氏为主要关键字,名字为次要关键字”进行排序。开发者可能会先按名字排序,再按姓氏进行排序。如果排序算法是稳定的,这样就可以达到“先姓氏,后名字”的排序效果。如果是不稳定的,就不行。

Array.prototype.sort() 为数组自带的排序方法,该方法在早期实现中,排序是否稳定,留给浏览器自己决定,这导致一部分实现是不稳定的。

但ES2019明确规定,Array.prototype.sort()的默认排序算法必须稳定。目前规定已经做到了,现在 JavaScript 各个主要实现的默认排序算法都是稳定的。

下面我们可以通过代码实例来查看一下相关效果:

const arr = [
  'peach',
  'straw',
  'apple',
  'spork'
];
 
const stableSorting = (s1, s2) => {
  if (s1[0] < s2[0]) return -1;
  return 1;
};
 
arr.sort(stableSorting)
// ["apple", "peach", "straw", "spork"]

上面代码对数组arr按照首字母进行排序。排序结果中,strawspork的前面,跟原始顺序一致,排序算法稳定